
#include "./../inc/touch.hpp"

using namespace std;

Touch::Touch(LCD &lcd_ref, Toolbar &toolbar_ref) : lcd(lcd_ref), toolbar(toolbar_ref)
{
    x = -1, y = -1;
    last_x = -1, last_y = -1;
    is_touching = 0;
    color = BLACK;
    radius = 5;
    touch_init();
}

Touch::~Touch()
{
    fclose(fp_touch);
    cout << "close touch success" << endl;
}

void Touch::touch_init()
{
    fp_touch = fopen("/dev/input/event0", "r");
    if (fp_touch == NULL)
    {
        perror("touch_fopen");
        return;
    }
    cout << "open touch success" << endl;
}

void Touch::detect_init()
{
    // 读取触摸屏数据
    struct input_event buf;

    while (1)
    {

        memset(&buf, 0, sizeof(buf));
        fread(&buf, sizeof(buf), 1, fp_touch);

        if (buf.type == EV_ABS)
        {
            if (buf.code == ABS_X)
            {
                x = buf.value;
            }
            else if (buf.code == ABS_Y)
            {
                y = buf.value;
            }
        }

        if (buf.type == EV_SYN)
        {
            if (x != -1 && y != -1)
            {
                if (y <= 48)
                {
                    touch_handle();
                    touch_release(); // 工具栏点击后重置触摸状态
                }
                else
                {
                    if (is_touching)
                    {
                        draw(); // 持续触摸，绘制连线
                    }
                    else
                    {
                        // 新开始触摸，只画点
                        lcd.draw_circle_fast(x, y, radius, color);
                        last_x = x;
                        last_y = y;
                        is_touching = 1;
                    }
                }
            }
        }
        else if (buf.type == EV_KEY && buf.code == BTN_TOUCH)
        {
            if (buf.value == 0)
            {
                touch_release(); // 触摸释放
            }
            else if (buf.value == 1)
            {
                // 触摸按下（开始新的触摸序列）
                is_touching = 1;
                last_x = -1; // 强制重新开始
                last_y = -1;
            }
        }
    }
}

void Touch::touch_handle()
{

    if (x > 5 && x < 45)
    {
        // 画笔工具
        color = BLACK;
    }
    else if (x > 55 && x < 95)
    {
        // 橡皮工具
        color = WHITE;
    }
    else if (x > 155 && x < 195)
    {
        // 半径5的圆（黑色）
        radius = 5;
    }
    else if (x > 205 && x < 245)
    {
        // 半径10的圆（黑色）
        radius = 10;
    }
    else if (x > 255 && x < 295)
    {
        // 半径15的圆（黑色）
        radius = 15;
    }
    else if (x > 305 && x < 345)
    {
        // 半径20的圆（黑色）
        radius = 20;
    }
    else if (x > 355 && x < 405)
    {
        // 黄色方块
        color = YELLOW;
    }
    else if (x > 405 && x < 455)
    {
        // 红色方块
        color = RED;
    }
    else if (x > 455 && x < 505)
    {
        // 绿色方块
        color = GREEN;
    }
    else if (x > 505 && x < 555)
    {
        // 蓝色方块
        color = BLUE;
    }
    else if (x > 750 && x < 800)
    {

        memset(lcd.get_lcd_mmap(), WHITE, lcd.get_lcd_height() * lcd.get_lcd_width() * 4);
        toolbar.showToolbar();
    }
}

void Touch::touch_release()
{
    last_x = -1;
    last_y = -1;
}

void Touch::draw()
{
    if (last_x == -1 || last_y == -1)
    {
        // 第一次触摸，只画一个点
        lcd.draw_circle_fast(x, y, radius, color);
    }
    else
    {
        // // 计算两点距离，如果距离太近则优化
        // int dx = abs(x - last_x);
        // int dy = abs(y - last_y);

        lcd.draw_line_fast(last_x, last_y, x, y, radius, color);
    }

    // 更新上一个点坐标
    last_x = x;
    last_y = y;
}